WebAssembly ์ ์ญ ํ์ ์ ๊ฐ๋ณ์ฑ, ์์ ์ ์ด ๋ฐฉ๋ฒ์ ์์๋ณด๊ณ , ์ด๊ฒ์ด ์ต์ ์น ๊ฐ๋ฐ์ ๋ณด์, ์ฑ๋ฅ, ์ํธ ์ด์ฉ์ฑ์ ๋ฏธ์น๋ ์ํฅ์ ํ์ํฉ๋๋ค.
WebAssembly ์ ์ญ ํ์ ๊ฐ๋ณ์ฑ: ์ ์ญ ๋ณ์ ์์ ์ ์ด
WebAssembly(Wasm)๋ ๊ณ ์ฑ๋ฅ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฑ์ ์ ์ํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. WebAssembly ๊ธฐ๋ฅ์ ํต์ฌ์ ์ธ ์ธก๋ฉด์ ์ ์ญ ๋ณ์(globals)๋ผ๋ ๊ฐ๋ ์ผ๋ก, ์ด๋ Wasm ๋ชจ๋ ์ ์ฒด์์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋ ๋ณ์์ ๋๋ค. ์ด๋ฌํ ์ ์ญ ๋ณ์์ ๊ฐ๋ณ์ฑ์ ์ดํดํ๋ ๊ฒ์ WebAssembly ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์, ์ฑ๋ฅ ๋ฐ ์์ธก ๊ฐ๋ฅํ ๋์์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
WebAssembly ์ ์ญ ๋ณ์๋ ๋ฌด์์ธ๊ฐ?
WebAssembly์์ ์ ์ญ ๋ณ์๋ Wasm ๋ชจ๋์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ ๊ทผํ๊ณ ์ ์ฌ์ ์ผ๋ก ์์ ํ ์ ์๋ ๋ณ์์ ๋๋ค. ์ ์ญ ๋ณ์๋ ํน์ ํ์ (์: i32, i64, f32, f64)์ผ๋ก ์ ์ธ๋๋ฉฐ ๊ฐ๋ณ(mutable) ๋๋ ๋ถ๋ณ(immutable)์ผ ์ ์์ต๋๋ค. ์ด ๊ฐ๋ณ์ฑ ์์ฑ์ ์ ์ญ ๋ณ์์ ๊ฐ์ด ์ด๊ธฐ ์ ์ ์ดํ์ ๋ณ๊ฒฝ๋ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์ ์ญ ๋ณ์๋ ํจ์ ๋ด์ ์ง์ญ ๋ณ์์๋ ๋ค๋ฆ ๋๋ค. ์ ์ญ ๋ณ์๋ ๋ ๊ธด ์๋ช ๊ณผ ๋์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ฉฐ, Wasm ๋ชจ๋ ์ธ์คํด์ค์ ์ ์ฒด ๊ธฐ๊ฐ ๋์ ์กด์ฌํฉ๋๋ค. ์ด๋ก ์ธํด ๊ณต์ ์ํ๋ ๊ตฌ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
์ ์ญ ๋ณ์ ์ ์ธ ๊ตฌ๋ฌธ
WebAssembly๋ ํ ์คํธ ํ์(WAT)๊ณผ ๋ฐ์ด๋๋ฆฌ ํ์(wasm)์ ์ฌ์ฉํฉ๋๋ค. ์ ์ญ ๋ณ์๋ฅผ ์ ์ธํ๋ WAT ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
(module
(global $my_global (mut i32) (i32.const 10))
)
์ด ์์์์:
$my_global์ ์ ์ญ ๋ณ์์ ์๋ณ์์ ๋๋ค.(mut i32)๋ ์ ์ญ ๋ณ์๊ฐ 32๋นํธ์ ๊ฐ๋ณ ์ ์์์ ์ง์ ํฉ๋๋ค.mut๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ถ๋ณ์ด ๋ฉ๋๋ค.(i32.const 10)์ ์ ์ญ ๋ณ์์ ์ด๊ธฐ๊ฐ(์ด ๊ฒฝ์ฐ 10)์ ์ ๊ณตํฉ๋๋ค.
๋ถ๋ณ ์ ์ญ ๋ณ์์ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
(module
(global $my_immutable_global i32 (i32.const 20))
)
๊ฐ๋ณ์ฑ ์ ์ด: ์ ์ญ ๋ณ์ ๊ด๋ฆฌ์ ํต์ฌ
WebAssembly์์ ์ ์ญ ๋ณ์ ์์ ์ ์ ์ดํ๋ ์ฃผ์ ๋ฉ์ปค๋์ฆ์ mut ํค์๋์
๋๋ค. ์ ์ญ ๋ณ์๋ฅผ mut๋ก ์ ์ธํ๋ฉด Wasm ๋ชจ๋ ์คํ ์ค์ ํด๋น ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ช
์์ ์ผ๋ก ํ์ฉํฉ๋๋ค. ๋ฐ๋๋ก mut ํค์๋๋ฅผ ์๋ตํ๋ฉด ๋ถ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ ์ธํ๊ฒ ๋๋ฉฐ, ์ด ๊ฐ์ ์ด๊ธฐํ ํ ์ผ์ ํ๊ฒ ์ ์ง๋ฉ๋๋ค.
์ด๋ฌํ ๊ฐ๋ณ์ฑ ์ ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ๋งค์ฐ ์ค์ํฉ๋๋ค:
- ๋ณด์: ๋ถ๋ณ ์ ์ญ ๋ณ์๋ ์ค์ํ ๋ฐ์ดํฐ์ ์๋์น ์์ ๋๋ ์ ์์ ์ธ ์์ ์ ๋ํด ์ผ์ ์์ค์ ๋ณดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฑ๋ฅ: ์ปดํ์ผ๋ฌ๋ ํน์ ๊ฐ์ด ์์์์ ์ ๋ ์ฝ๋๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ ์ ์์ต๋๋ค.
- ์ฝ๋ ์ ํ์ฑ: ๋ถ๋ณ์ฑ์ ๊ฐ์ ํ๋ฉด ์๊ธฐ์น ์์ ์ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฏธ๋ฌํ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ฐ๋ณ ์ ์ญ ๋ณ์
๊ฐ๋ณ ์ ์ญ ๋ณ์๋ Wasm ๋ชจ๋ ์คํ ์ค์ ๋ณ์ ๊ฐ์ ์ ๋ฐ์ดํธํด์ผ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์นด์ดํฐ: ํจ์๊ฐ ํธ์ถ๋ ํ์๋ฅผ ์ถ์ ํฉ๋๋ค.
- ์ํ ๋ณ์: ๊ฒ์์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ด๋ถ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
- ํ๋๊ทธ: ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.
์์ (WAT):
(module
(global $counter (mut i32) (i32.const 0))
(func (export "increment")
(global.get $counter)
(i32.const 1)
(i32.add)
(global.set $counter))
)
์ด ์์๋ increment ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฆ๊ฐ์ํฌ ์ ์๋ ๊ฐ๋จํ ์นด์ดํฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ถ๋ณ ์ ์ญ ๋ณ์
๋ถ๋ณ ์ ์ญ ๋ณ์๋ ๋ณ์ ๊ฐ์ด ์ด๊ธฐ ์ ์ ์ดํ ๋ณ๊ฒฝ๋์ด์๋ ์ ๋ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์: PI๋ E์ ๊ฐ์ ์ํ์ ์์๋ฅผ ์ ์ํฉ๋๋ค.
- ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์: ๋ฐํ์ ์ค์ ์ฝ๊ธฐ๋ง ํ๊ณ ์์ ๋์ง ์๋ ์ค์ ์ ์ ์ฅํฉ๋๋ค.
- ๊ธฐ๋ณธ ์ฃผ์: ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํ๊ธฐ ์ํ ๊ณ ์ ์ฃผ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ (WAT):
(module
(global $PI f64 (f64.const 3.14159))
(func (export "get_circumference") (param $radius f64) (result f64)
(local.get $radius)
(f64.const 2.0)
(f64.mul)
(global.get $PI)
(f64.mul))
)
์ด ์์๋ ๋ถ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ PI ๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ ์ญ ๋ณ์
์ ์ญ ๋ณ์๋ WebAssembly ๋ด์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ธฐ๋ณธ ์ฃผ์๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํฌ๊ธฐ๋ฅผ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ ์ข ์ข ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ์ญ ๋ณ์๋ ํ์ฌ ํ ํฌ๊ธฐ๋ฅผ ์ ์ฅํ ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ฑฐ๋ ํด์ ๋ ๋๋ง๋ค ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด Wasm ๋ชจ๋์ JavaScript์ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด์์ ํํ ๋ณผ ์ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฉ์ปค๋์ฆ์ ์์กดํ์ง ์๊ณ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์ (์ค๋ช ์ฉ, ๊ฐ์ํ๋จ):
(module
(global $heap_base (mut i32) (i32.const 1024)) ;; Initial heap base address
(global $heap_size (mut i32) (i32.const 0)) ;; Current heap size
(func (export "allocate") (param $size i32) (result i32)
;; Check if enough memory is available (simplified)
(global.get $heap_size)
(local.get $size)
(i32.add)
(i32.const 65536) ;; Example maximum heap size
(i32.gt_u) ;; Unsigned greater than?
(if (then (return (i32.const -1))) ;; Out of memory: Return -1
;; Allocate memory (simplified)
(global.get $heap_base)
(local $allocated_address i32 (global.get $heap_base))
(global.get $heap_size)
(local.get $size)
(i32.add)
(global.set $heap_size)
(return (local.get $allocated_address))
)
)
์ด ๋งค์ฐ ๊ฐ์ํ๋ ์์๋ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ๊ด๋ฆฌํ๋ ๊ธฐ๋ณธ ์์ด๋์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ค์ ํ ๋น์๋ ์ฌ์ ๋ชฉ๋ก, ์ ๋ ฌ ๊ณ ๋ ค ์ฌํญ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ์ ํฌํจํ์ฌ ํจ์ฌ ๋ ๋ณต์กํ๋ค๋ ์ ์ ์ ์ํ์ญ์์ค.
์ ์ญ ๊ฐ๋ณ์ฑ์ ๋ณด์์ ํจ์
์ ์ญ ๋ณ์์ ๊ฐ๋ณ์ฑ์ ์๋นํ ๋ณด์์ ํจ์๋ฅผ ๊ฐ์ง๋๋ค. ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ ์กฐ์ฌ์ค๋ฝ๊ฒ ๋ค๋ฃจ์ง ์์ผ๋ฉด ์ ์ฌ์ ์ธ ๊ณต๊ฒฉ ๋ฒกํฐ๊ฐ ๋ ์ ์์ต๋๋ค. Wasm ๋ชจ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํด ์์ ๋ ์ ์์ด ์๊ธฐ์น ์์ ๋์์ด๋ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ์ฌ์ ๋ณด์ ์ํ:
- ๋ฐ์ดํฐ ์์: ๊ณต๊ฒฉ์๊ฐ ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์์ ํ์ฌ Wasm ๋ชจ๋์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์์์ํฌ ์ ์์ต๋๋ค.
- ์ ์ด ํ๋ฆ ํ์ด์ฌํน: ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ๊ณ , ์ ์ฌ์ ์ผ๋ก ์์ ์ฝ๋ ์คํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ ๋ณด ์ ์ถ: ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉ์์๊ฒ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ถํ ์ ์์ต๋๋ค.
์ํ ์ ๋ต:
- ๊ฐ๋ณ์ฑ ์ต์ํ: ์๋์น ์์ ์์ ์ ์ํ์ ์ค์ด๊ธฐ ์ํด ๊ฐ๋ฅํ๋ฉด ๋ถ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ ์คํ ์ ํจ์ฑ ๊ฒ์ฌ: ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ฐ์ ๊ฒ์ฆํ์ฌ ์์ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํฉ๋๋ค.
- ์ ๊ทผ ์ ์ด: Wasm ๋ชจ๋์ ํน์ ๋ถ๋ถ๋ง ํน์ ์ ์ญ ๋ณ์๋ฅผ ์์ ํ ์ ์๋๋ก ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ: ์ฝ๋๋ฅผ ์ฒ ์ ํ ๊ฒํ ํ์ฌ ๊ฐ๋ณ ์ ์ญ ๋ณ์์ ๊ด๋ จ๋ ์ ์ฌ์ ์ทจ์ฝ์ ์ ์๋ณํฉ๋๋ค.
- ์๋๋ฐ์ฑ: WebAssembly์ ์๋๋ฐ์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ Wasm ๋ชจ๋์ ํธ์คํธ ํ๊ฒฝ์ผ๋ก๋ถํฐ ๊ฒฉ๋ฆฌํ๊ณ ๋ฆฌ์์ค ์ ๊ทผ์ ์ ํํฉ๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ
์ ์ญ ๋ณ์์ ๊ฐ๋ณ์ฑ์ WebAssembly ์ฝ๋์ ์ฑ๋ฅ์๋ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ถ๋ณ ์ ์ญ ๋ณ์๋ ์ปดํ์ผ ํ์์ ๊ฐ์ ์ ์ ์์ผ๋ฏ๋ก ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ฝ๊ฒ ์ต์ ํํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ ์ถ๊ฐ์ ์ธ ๋ฐํ์ ๊ฒ์ฌ ๋ฐ ์ต์ ํ๊ฐ ํ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
๋ถ๋ณ์ฑ์ ์ฑ๋ฅ ์ด์ :
- ์์ ์ ํ: ์ปดํ์ผ๋ฌ๋ ๋ถ๋ณ ์ ์ญ ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ค์ ๊ฐ์ผ๋ก ๋์ฒดํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ์ธ๋ผ์ด๋: ๋ถ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ํจ์๋ ๋ ์ฝ๊ฒ ์ธ๋ผ์ธ๋ ์ ์์ด ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํต๋๋ค.
- ์ฃฝ์ ์ฝ๋ ์ ๊ฑฐ: ๋ถ๋ณ ์ ์ญ ๋ณ์๊ฐ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ด์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๊ฐ๋ณ์ฑ์ ๋ํ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ:
- ๋ฐํ์ ๊ฒ์ฌ: ์ปดํ์ผ๋ฌ๋ ๊ฐ๋ณ ์ ์ญ ๋ณ์๊ฐ ์์ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ์ฝ์ ํด์ผ ํ ์ ์์ต๋๋ค.
- ์บ์ ๋ฌดํจํ: ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์์ ํ๋ฉด ์บ์๋ ๊ฐ์ด ๋ฌดํจํ๋์ด ์บ์ฑ์ ํจ์จ์ฑ์ด ๊ฐ์ํ ์ ์์ต๋๋ค.
- ๋๊ธฐํ: ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์๋ ๊ฐ๋ณ ์ ์ญ ๋ณ์์ ๋ํ ์ ๊ทผ์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ด ํ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
JavaScript์์ ์ํธ ์ด์ฉ์ฑ
WebAssembly ๋ชจ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ข ์ข JavaScript ์ฝ๋์ ์ํธ ์์ฉํฉ๋๋ค. ์ ์ญ ๋ณ์๋ JavaScript์์ ๊ฐ์ ธ์ค๊ฑฐ๋ ๋ด๋ณด๋ผ ์ ์์ด ๋ ํ๊ฒฝ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
JavaScript์์ ์ ์ญ ๋ณ์ ๊ฐ์ ธ์ค๊ธฐ:
WebAssembly ๋ชจ๋์ ๋ชจ๋์ import ์น์ ์ ์ ์ธํ์ฌ JavaScript์์ ์ ์ญ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด JavaScript ์ฝ๋๋ Wasm ๋ชจ๋์์ ์ฌ์ฉ๋๋ ์ ์ญ ๋ณ์์ ์ด๊ธฐ๊ฐ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์์ (WAT):
(module
(import "js" "external_counter" (global (mut i32)))
(func (export "get_counter") (result i32)
(global.get 0))
)
JavaScript์์:
const importObject = {
js: {
external_counter: new WebAssembly.Global({ value: 'i32', mutable: true }, 42),
},
};
WebAssembly.instantiateStreaming(fetch('module.wasm'), importObject)
.then(results => {
console.log(results.instance.exports.get_counter()); // Output: 42
});
JavaScript๋ก ์ ์ญ ๋ณ์ ๋ด๋ณด๋ด๊ธฐ:
WebAssembly ๋ชจ๋์ ๋ํ ์ ์ญ ๋ณ์๋ฅผ JavaScript๋ก ๋ด๋ณด๋ผ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด JavaScript ์ฝ๋๋ Wasm ๋ชจ๋ ๋ด์ ์ ์๋ ์ ์ญ ๋ณ์์ ๊ฐ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
์์ (WAT):
(module
(global (export "internal_counter") (mut i32) (i32.const 0))
(func (export "increment")
(global.get 0)
(i32.const 1)
(i32.add)
(global.set 0))
)
JavaScript์์:
WebAssembly.instantiateStreaming(fetch('module.wasm'))
.then(results => {
const instance = results.instance;
console.log(instance.exports.internal_counter.value); // Output: 0
instance.exports.increment();
console.log(instance.exports.internal_counter.value); // Output: 1
});
์ํธ ์ด์ฉ์ฑ ๊ณ ๋ ค ์ฌํญ:
- ํ์ ์ผ์น: JavaScript์์ ๊ฐ์ ธ์ค๊ฑฐ๋ ๋ด๋ณด๋ด๋ ์ ์ญ ๋ณ์์ ํ์ ์ด Wasm ๋ชจ๋์ ์ ์ธ๋ ํ์ ๊ณผ ์ผ์นํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
- ๊ฐ๋ณ์ฑ ์ ์ด: JavaScript์ ์ํธ ์์ฉํ ๋ ์ ์ญ ๋ณ์์ ๊ฐ๋ณ์ฑ์ ์ ์ํด์ผ ํฉ๋๋ค. JavaScript ์ฝ๋๊ฐ ์๊ธฐ์น ์์ ๋ฐฉ์์ผ๋ก ๊ฐ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ณด์: JavaScript์์ ์ ์ญ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ์ ์์ ์ธ JavaScript ์ฝ๋๊ฐ Wasm ๋ชจ๋์ ํด๋ก์ด ๊ฐ์ ์ฃผ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ธฐ๋ฒ
๋จ์ํ ๋ณ์ ์ ์ฅ ์ธ์๋, ์ ์ญ ๋ณ์๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ๋ ๊ณ ๊ธ์ค๋ฌ์ด ๋ฐฉ์์ผ๋ก ํ์ฉ๋ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
์ค๋ ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง(TLS) ์๋ฎฌ๋ ์ด์
WebAssembly์๋ ๋ค์ดํฐ๋ธ TLS๊ฐ ์์ง๋ง, ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฎฌ๋ ์ดํธํ ์ ์์ต๋๋ค. ๊ฐ ์ค๋ ๋๋ TLS ์ญํ ์ ํ๋ ๊ณ ์ ํ ์ ์ญ ๋ณ์๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ ๊ฐ ์ค๋ ๋๊ฐ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํ๋ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค.
์์ (๊ฐ๋ ์ค๋ช ์ฉ):
;; In a threading context (pseudocode)
(module
(global $thread_id i32 (i32.const 0)) ;; Assume this is somehow initialized per thread
(global $tls_base (mut i32) (i32.const 0))
(func (export "get_tls_address") (result i32)
(global.get $thread_id)
(i32.mul (i32.const 256)) ;; Example: 256 bytes per thread
(global.get $tls_base)
(i32.add))
;; ... Access memory at the calculated address...
)
์ด ์์๋ ์ ์ญ ๋ณ์์ ์ ์ฅ๋ ์ค๋ ๋ ID์ ๊ธฐ๋ณธ ์ฃผ์์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ๊ฐ ์ค๋ ๋์ TLS์ ๋ํ ๊ณ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋์ ์ฐ๊ฒฐ ๋ฐ ๋ชจ๋ ๊ตฌ์ฑ
์ ์ญ ๋ณ์๋ ์๋ก ๋ค๋ฅธ WebAssembly ๋ชจ๋์ด ๋ฐํ์์ ๋ก๋๋๊ณ ์ฐ๊ฒฐ๋๋ ๋์ ์ฐ๊ฒฐ ์๋๋ฆฌ์ค์์ ์ญํ ์ ํ ์ ์์ต๋๋ค. ๊ณต์ ์ ์ญ ๋ณ์๋ ๋์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ ํต์ ์ง์ ์ด๋ ๊ณต์ ์ํ ์ญํ ์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ ์ ๋ง์ปค ๊ตฌํ์ ํฌํจํ๋ ๋ ๋ณต์กํ ์ฃผ์ ์ ๋๋ค.
์ต์ ํ๋ ์๋ฃ ๊ตฌ์กฐ
์ ์ญ ๋ณ์๋ WebAssembly์์ ๊ตฌํ๋ ์ฌ์ฉ์ ์ ์ ์๋ฃ ๊ตฌ์กฐ์ ๊ธฐ๋ณธ ํฌ์ธํฐ๋ก๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ๋ชจ๋ ๊ฒ์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๊ฒ๋ณด๋ค ๋ฐ์ดํฐ์ ๋ ํจ์จ์ ์ผ๋ก ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ญ ๋ณ์๋ ๋ฏธ๋ฆฌ ํ ๋น๋ ํฐ ๋ฐฐ์ด์ ์์์ ์ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค.
์ ์ญ ๋ณ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
WebAssembly ์ฝ๋์ ๋ณด์, ์ฑ๋ฅ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด ์ ์ญ ๋ณ์ ๊ด๋ฆฌ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๊ฐ๋ฅํ๋ฉด ๋ถ๋ณ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ด๋ ์๋์น ์์ ์์ ์ ์ํ์ ์ค์ด๊ณ ์ปดํ์ผ๋ฌ๊ฐ ๋ ๊ณต๊ฒฉ์ ์ธ ์ต์ ํ๋ฅผ ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
- ๊ฐ๋ณ ์ ์ญ ๋ณ์์ ๋ฒ์๋ฅผ ์ต์ํํ์ญ์์ค. ์ ์ญ ๋ณ์๊ฐ ๊ฐ๋ณ์ ์ด์ด์ผ ํ๋ค๋ฉด, ๊ทธ ๋ฒ์๋ฅผ ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ์ฝ๋ ์์ญ์ผ๋ก ์ ํํ์ญ์์ค.
- ์ฌ์ฉํ๊ธฐ ์ ์ ๊ฐ๋ณ ์ ์ญ ๋ณ์์ ๊ฐ์ ๊ฒ์ฆํ์ญ์์ค. ์ด๋ ๋ฐ์ดํฐ ์์ ๋ฐ ์ ์ด ํ๋ฆ ํ์ด์ฌํน์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํน์ ์ ์ญ ๋ณ์๋ฅผ ์์ ํ ์ ์๋ Wasm ๋ชจ๋ ๋ถ๋ถ์ ์ ํํ๊ธฐ ์ํด ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ญ์์ค.
- ๊ฐ๋ณ ์ ์ญ ๋ณ์์ ๊ด๋ จ๋ ์ ์ฌ์ ์ทจ์ฝ์ ์ ์๋ณํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฒ ์ ํ ๊ฒํ ํ์ญ์์ค.
- ๊ฐ ์ ์ญ ๋ณ์์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ฌธ์ํํ์ญ์์ค. ์ด๋ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ ๋์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๊ณ ๊ธ ์ธ์ด ๋ฐ ๋๊ตฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, Rust ๋ฐ AssemblyScript๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ธฐ๋ฅ ๋ฐ ์ ์ญ ๋ณ์์ ๊ด๋ จ๋ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
ํฅํ ๋ฐฉํฅ
WebAssembly ์ฌ์์ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, ์ ์ญ ๋ณ์ ๊ด๋ฆฌ์ ๋ํ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ํฅํ ๋ฐฉํฅ์ด ์์ต๋๋ค:
- ๋ค์ดํฐ๋ธ ์ค๋ ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง(TLS): WebAssembly์ TLS์ ๋ํ ๋ค์ดํฐ๋ธ ์ง์์ ์ถ๊ฐํ๋ฉด ์๋ฎฌ๋ ์ด์ ๊ธฐ์ ์ด ํ์ ์์ด์ง๊ณ ์ฑ๋ฅ์ด ํฅ์๋ ๊ฒ์ ๋๋ค.
- ๋ ์ธ๋ถํ๋ ์ ๊ทผ ์ ์ด: ์ ์ญ ๋ณ์์ ๋ํ ๋ ์ธ๋ถํ๋ ์ ๊ทผ ์ ์ด ๋ฉ์ปค๋์ฆ์ ๋์ ํ๋ฉด ๊ฐ๋ฐ์๊ฐ Wasm ๋ชจ๋์ ์ด๋ ๋ถ๋ถ์ด ํน์ ์ ์ญ ๋ณ์์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์๋์ง๋ฅผ ๋ ์ ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
- ๊ฐ์ ๋ ์ปดํ์ผ๋ฌ ์ต์ ํ: ์ปดํ์ผ๋ฌ ์ต์ ํ์ ์ง์์ ์ธ ๊ฐ์ ์ ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ WebAssembly ์ฝ๋์ ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํฌ ๊ฒ์ ๋๋ค.
- ํ์คํ๋ ๋์ ์ฐ๊ฒฐ: ๋์ ์ฐ๊ฒฐ์ ๋ํ ํ์คํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ฐํ์์ WebAssembly ๋ชจ๋์ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๋จ์ํํ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
WebAssembly ์ ์ญ ํ์ ๊ฐ๋ณ์ฑ๊ณผ ์์ ์ ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ ์์ ํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ ์ ๋ขฐํ ์ ์๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ ์ญ ๋ณ์์ ๊ฐ๋ณ์ฑ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฆ์ผ๋ก์จ ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ์ํํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉฐ ์ฝ๋์ ์ ํ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. WebAssembly๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ ์ญ ๋ณ์ ๊ด๋ฆฌ๋ฅผ ์ํ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๊ธฐ์ ์ด ๋ฑ์ฅํ์ฌ ์ด ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋ฅ๋ ฅ์ ๋์ฑ ํฅ์์ํฌ ๊ฒ์ ๋๋ค. ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ , ์๋ฒ ๋๋ ์์คํ ๋๋ ์๋ฒ ์ธก ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ฐํ๋ , WebAssembly ์ ์ญ ๋ณ์์ ๋ํ ํ์คํ ์ดํด๋ ๊ทธ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๋ ๋ฐ ํ์์ ์ ๋๋ค.